package com.schedule;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.entity.MPost;
import com.service.MPostService;
import com.utils.RedisUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;
import java.util.Set;

@Component
public class ViewCountSyncTask {

    @Autowired
    RedisUtil redisUtil;

    @Autowired
    RedisTemplate redisTemplate;

    @Autowired
    MPostService postService;


    @Scheduled(cron = "0/5 * * * * *") //每五秒同步一次
    public void task() {
        //查找缓存中“rank:post:*”的key（即放入缓存中的文章信息）,返回一个set集合
        Set<String> keys = redisTemplate.keys("rank:post:*");//自定义redisUtil中没有获取多个值的方法，只能使用原生的redisTemplate

        List<String> ids = new ArrayList<>();
        for (String key : keys) {
            if(redisUtil.hHasKey(key, "post:viewCount")){
                ids.add(key.substring("rank:post:".length()));
                //key.substring("rank:post:".length())意思是将‘rank:post’这段去掉，只留下Id：文章的Id.方便下文操作
            }
        }

        if(ids.isEmpty()) return;//若没有文章更新（通过key中的“post:viewCount”项判断），则直接返回，不用同步

        // 从数据库中查询所有 “更新了阅读量” 的文章
        List<MPost> posts = postService.list(new QueryWrapper<MPost>().in("id", ids));

        posts.stream().forEach((post) ->{
            //从缓存中获取更新后的文章浏览量，然后放在实体类中
            Integer viewCount = (Integer) redisUtil.hget("rank:post:" + post.getId(), "post:viewCount");
            post.setViewCount(viewCount);
        });

        if(posts.isEmpty()) return;//文章若此时被删除之后，直接返回
        //写入数据库中
        boolean isSucc = postService.updateBatchById(posts);
        //写入成功之后删除“rank:post:* 中的项：post:viewCount”  若不删除，key的项一直存在会导致一直自动更新（每隔五秒）
        if(isSucc) {
            ids.stream().forEach((id) -> {
                redisUtil.hdel("rank:post:" + id, "post:viewCount");
                System.out.println(id + "---------------------->同步成功");
            });
        }
    }

}
